<?php
/**
 * 由于独立分组配置文件优先级问题，U方法无法使用分组配置中的URL模式，不同分组不同URL模式会导致生成的url冲突。
 * 本函数作为一个上层封装，将U方法处理后的url进行二次处理得到合适的url
 * 要求项目默认url模式为1
 */
function _U($url='',$vars='',$suffix=true,$redirect=false,$domain=false) {
    $url=U($url,$vars,$suffix,$redirect,$domain);//调用原始U方法
    if(!$url){
        return "";
    }
    $urlmodel=C('URL_MODEL');//获取URL模式，优先级为：分组配置>项目配置>惯例配置
    //rewrite模式
    if($urlmodel==2){
        $url=str_replace("/index.php","",$url);
    }
    //兼容模式
    if($urlmodel==3){
        $url=str_replace("/index.php","/index.php?s=",$url);
    }
    return $url;
}

/**
 * 根据自定义的url规则生成最终url
 * @param string $urlrule url规则
 * @param array $vars 通配变量数组
 * @return string 最终得到的url
 */
function anchor($urlrule,$vars){
    $urlrule=explode("||",$urlrule);
    if(!isset($vars["p"])){
        $urlrule=$urlrule[0];
    }else{
        $urlrule=isset($urlrule[1])?$urlrule[1]:$urlrule[0];//如果有分页参数，则使用第二规则，第二规则不存在则还是用第一规则
    }
    
    $url=_U('/'.preg_replace('/#(.+?)#/ies',"\$vars['\${1}']",$urlrule));
    return $url;
}
/**
 * 数字转成字母，短地址
 * @param mixed $in 明文/密文
 * @param bool $to_num 是否转成数字
 * @param mixed $pad_up 最短长度
 * @param mixed $passKey 密钥
 * @return mixed
 */
function alphaID($in, $to_num = false, $pad_up = 6, $passKey = NULL) {
    if(function_exists("bcpow")){
        $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    }else{
        $index = "abcdefghijklmnopqrstuvwxy";
    }
    if ($passKey !== null) {
        // Although this function's purpose is to just make the  
        // ID short - and not so much secure,  
        // with this patch by Simon Franz (http://blog.snaky.org/)  
        // you can optionally supply a password to make it harder  
        // to calculate the corresponding numeric ID  

        for ($n = 0; $n < strlen($index); $n++) {
            $i[] = substr($index, $n, 1);
        }

        $passhash = hash('sha256', $passKey);
        $passhash = (strlen($passhash) < strlen($index)) ? hash('sha512', $passKey) : $passhash;

        for ($n = 0; $n < strlen($index); $n++) {
            $p[] = substr($passhash, $n, 1);
        }

        array_multisort($p, SORT_DESC, $i);
        $index = implode($i);
    }

    $base = strlen($index);
    
    if ($to_num) {
        // Digital number  <<--  alphabet letter code  
        $in = strrev($in);
        $out = 0;
        $len = strlen($in) - 1;
        for ($t = 0; $t <= $len; $t++) {
			if(function_exists("bcpow")){
				$bcpow = bcpow($base, $len - $t);
			}else{
				$bcpow = pow($base, $len - $t);
			}
            $out = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
        }

        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $out -= pow($base, $pad_up);
            }
        }
        $out = sprintf('%F', $out);
        $out = substr($out, 0, strpos($out, '.'));
    } else {
        // Digital number  -->>  alphabet letter code  
        if (is_numeric($pad_up)) {
            $pad_up--;
            if ($pad_up > 0) {
                $in += pow($base, $pad_up);
            }
        }

        $out = "";
        for ($t = floor(log($in, $base)); $t >= 0; $t--) {
			if(function_exists("bcpow")){
				$bcp = bcpow($base, $t);
			}else{
				
				$bcp = pow($base, $t);
			}
			
            $a = floor($in / $bcp) % $base;
            $out = $out . substr($index, $a, 1);
            $in = $in - ($a * $bcp);
        }
        $out = strrev($out); // reverse  
    }

    return $out;
}
//获取指定缓存参数
function GetCacheOptions($identify=""){
    static $_options=NULL;
    if(empty($identify)){
        return FALSE;
    }
    if(isset($_options)){
        return (array)$_options[$identify];
    }
    $_options=F('CacheOptions');
    if($_options===FALSE){
        $list=M('cachemanage')->select();
        foreach($list as $eachlist){
            $option['temp']=!empty($eachlist['temp'])?RUNTIME_PATH.$eachlist['temp']:TEMP_PATH;
            $option['expire']=(int)$eachlist['expire'];
            $_options[$eachlist['identify']]=$option;
        }
        F('CacheOptions',$_options);
    }
    return (array)$_options[$identify];
}
/**
 * 获取前台模板物理路径
 * @param string $name 模板名，不带后缀
 * @return string 物理路径
 */
function GetTplPath($name=""){
    if(empty($name)) return "";
    $theme=C('cfg_theme');//主题名
    if($theme!=""){
        $theme=$theme."/";
    }else{
        $theme="default/";//默认主题
    }
    $tplfile=CMS_TPLDIR.$theme.$name.".html";//模板文件名
    if(!file_exists($tplfile)){
        return "";
    }
    return $tplfile;
}

/**
 * 获取文档tags链接
 * @param type $aid 文档id
 * @param type $count 最多需要的tag数量
 * @return string
 */
function GetTagLinks($aid=0,$count=0){
    return "<a>tag待开发</a>";
}

/**
 * 小助手加载器，helper('helper1'[,'helper2','helper3',……])
 */
function helper(){
    $helpers=  func_get_args();
    if(!empty($helpers)){
        foreach($helpers as $helper){
            $file=COMMON_PATH.'helpers/'.$helper.'.php';
            if(file_exists($file)){
                include $file;
            }else{
                echo '小助手文件'.$file.'不存在';
            }
        }
    }
}


//从给定字符串列表里随机取一个字符串
function randstr(){
    $args_num =  func_num_args();//参数数量
    $args =  func_get_args();
    $num = rand(1,$args_num);
    return $args[$num-1];
}

//自定义标签获取实例
function TagLibInstance($class=""){
    static $_TagLib;
    if(isset($_TagLib[$class])){
        return $_TagLib[$class];
    }
    $libpath=rtrim(LIB_PATH,"/")."/TagLib/";//自定义标签碎片类库目录
    if(!require_cache($libpath.$class.".class.php")){
        return FALSE;
    }
    if(class_exists($class)){
        $_TagLib[$class]=new $class();
    }
    return $_TagLib[$class];
}

//递归删除一个目录或删除一个文件
function DelDirOrFile($temp){
    if(is_file($temp)){
        @unlink($temp);
    }elseif(is_dir($temp)){
        if($d=opendir($temp)){//打开目录句柄
            while(false!==($file=readdir($d))){
                if ($file != "." && $file != "..") {
                    DelDirOrFile(rtrim($temp,'/').'/'.$file);
                }
            }
        }
    }else{
        return FALSE;
    }
    return TRUE;
}
  